let R = require('ramda');

let IO = function (f) {
  this.__value = f;
};

IO.of = function (x) {
  return new IO(function () {
    return x;
  });
};

IO.prototype.map = function (f) {
  return new IO(R.compose(f, this.__value));
};

// 如何理解 io 函子

// 比如现在想从`环境中获取 key 对应的值
// 直接返回一个方法，就可以让外面的方法变纯了。。。
function getFromGlobal(key) {
  return function () {
    return global[key]
  }
}

global['name'] = 'judasnow';
// let getName = getFromGlobal('name');
// console.dir(getName());

// 如果使用 io 函子
let io_global = new IO(function () {
  return global;
});

let x = io_global.map(function (glo) {
  return glo['name'];
});

// io 中的值（一个函数）的返回值，作为 map 传递函数的参数
console.dir(x)

// 这样和 promise 是不是很相似?
